# -*- coding: utf-8 -*-
"""
第三方API配置模块
支持多个API服务商的福彩3D数据获取
"""

import os
from typing import List, Dict, Any, Optional
from loguru import logger

# API使用指南
API_USAGE_GUIDE = """
第三方API配置指南:

1. 极速数据API (推荐):
   - 注册地址: https://www.jisuapi.com/
   - 免费额度: 100次/天
   - 配置方法: export JISU_API_KEY='your_api_key'

2. 六派数据API:
   - 注册地址: https://www.6api.net/
   - 免费额度: 100次/天
   - 配置方法: export LIUPAI_API_KEY='your_api_key'

3. 聚合数据API:
   - 注册地址: https://www.juhe.cn/docs/api/id/300
   - 配置方法: export JUHE_API_KEY='your_api_key'

配置步骤:
1. 复制 .env.api.example 为 .env
2. 编辑 .env 文件，填入真实的API密钥
3. 重新运行爬虫程序
"""

# API配置字典
API_CONFIGS = {
    'fc3d': {
        'jisu': {
            'name': '极速数据API',
            'base_url': 'https://api.jisuapi.com/lottery/query',
            'params': {
                'appkey': lambda: os.getenv('JISU_API_KEY', ''),
                'lotteryid': 'fc3d'
            },
            'headers': {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            },
            'timeout': 10,
            'response_format': 'jisu',
            'enabled': lambda: bool(os.getenv('JISU_API_KEY')),
            'free_limit': '100次/天',
            'register_url': 'https://www.jisuapi.com/'
        },
        'liupai': {
            'name': '六派数据API',
            'base_url': 'https://api.6api.net/lottery/fc3d',
            'params': {
                'key': lambda: os.getenv('LIUPAI_API_KEY', '')
            },
            'headers': {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            },
            'timeout': 10,
            'response_format': 'liupai',
            'enabled': lambda: bool(os.getenv('LIUPAI_API_KEY')),
            'free_limit': '100次/天',
            'register_url': 'https://www.6api.net/'
        },
        'juhe': {
            'name': '聚合数据API',
            'base_url': 'https://apis.juhe.cn/lottery/query',
            'params': {
                'key': lambda: os.getenv('JUHE_API_KEY', ''),
                'lottery_id': 'fc3d'
            },
            'headers': {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            },
            'timeout': 10,
            'response_format': 'juhe',
            'enabled': lambda: bool(os.getenv('JUHE_API_KEY')),
            'free_limit': '查看套餐',
            'register_url': 'https://www.juhe.cn/docs/api/id/300'
        }
    }
}

# API响应解析器配置
PARSER_CONFIGS = {
    'jisu': {
        'success_check': lambda data: data.get('status') == 0,
        'error_message': lambda data: data.get('msg', '未知错误'),
        'data_path': 'result',
        'field_mapping': {
            'issue': 'issueno',
            'numbers': 'number',
            'date': 'time'
        }
    },
    'liupai': {
        'success_check': lambda data: data.get('status') == 200,
        'error_message': lambda data: data.get('msg', '未知错误'),
        'data_path': 'data',
        'field_mapping': {
            'issue': 'expect',
            'numbers': 'opencode',
            'date': 'opentime'
        }
    },
    'juhe': {
        'success_check': lambda data: data.get('error_code') == 0,
        'error_message': lambda data: data.get('reason', '未知错误'),
        'data_path': 'result',
        'field_mapping': {
            'issue': 'lottery_no',
            'numbers': 'lottery_res',
            'date': 'lottery_date'
        }
    }
}

def get_available_apis(lottery_type: str = 'fc3d') -> List[Dict[str, Any]]:
    """
    获取可用的API配置列表
    
    Args:
        lottery_type: 彩票类型，默认为'fc3d'
        
    Returns:
        可用API配置列表
    """
    available_apis = []
    
    if lottery_type not in API_CONFIGS:
        logger.warning(f"不支持的彩票类型: {lottery_type}")
        return available_apis
    
    for api_key, config in API_CONFIGS[lottery_type].items():
        if config['enabled']():
            # 构建实际的参数字典
            params = {}
            for key, value in config['params'].items():
                if callable(value):
                    params[key] = value()
                else:
                    params[key] = value
            
            api_info = {
                'name': config['name'],
                'config': {
                    'base_url': config['base_url'],
                    'params': params,
                    'headers': config['headers'],
                    'timeout': config['timeout'],
                    'response_format': config['response_format']
                }
            }
            available_apis.append(api_info)
            logger.debug(f"添加可用API: {config['name']}")
    
    logger.info(f"找到 {len(available_apis)} 个可用的{lottery_type.upper()}API")
    return available_apis

def get_api_config(lottery_type: str = 'fc3d', api_name: str = None) -> Optional[Dict[str, Any]]:
    """
    获取指定API的配置
    
    Args:
        lottery_type: 彩票类型
        api_name: API名称，如果为None则返回第一个可用的API
        
    Returns:
        API配置字典或None
    """
    if lottery_type not in API_CONFIGS:
        return None
    
    if api_name:
        config = API_CONFIGS[lottery_type].get(api_name)
        if config and config['enabled']():
            return config
        return None
    else:
        # 返回第一个可用的API
        for api_key, config in API_CONFIGS[lottery_type].items():
            if config['enabled']():
                return config
        return None

def get_parser_config(response_format: str) -> Optional[Dict[str, Any]]:
    """
    获取响应解析器配置
    
    Args:
        response_format: 响应格式类型
        
    Returns:
        解析器配置字典或None
    """
    return PARSER_CONFIGS.get(response_format)

def list_all_apis() -> Dict[str, List[Dict[str, Any]]]:
    """
    列出所有API配置
    
    Returns:
        按彩票类型分组的API配置字典
    """
    all_apis = {}
    
    for lottery_type, apis in API_CONFIGS.items():
        all_apis[lottery_type] = []
        for api_key, config in apis.items():
            api_info = {
                'name': config['name'],
                'enabled': config['enabled'](),
                'free_limit': config['free_limit'],
                'register_url': config['register_url']
            }
            all_apis[lottery_type].append(api_info)
    
    return all_apis

def check_api_keys() -> Dict[str, bool]:
    """
    检查API密钥配置状态
    
    Returns:
        API密钥配置状态字典
    """
    api_keys = {
        'JISU_API_KEY': bool(os.getenv('JISU_API_KEY')),
        'LIUPAI_API_KEY': bool(os.getenv('LIUPAI_API_KEY')),
        'JUHE_API_KEY': bool(os.getenv('JUHE_API_KEY'))
    }
    
    configured_count = sum(api_keys.values())
    logger.info(f"API密钥配置状态: {configured_count}/3 已配置")
    
    return api_keys

# 环境变量配置说明
ENV_CONFIG_GUIDE = """
环境变量配置说明:

方法1 - 使用.env文件 (推荐):
1. 复制 .env.api.example 为 .env
2. 编辑 .env 文件，填入真实的API密钥
3. 示例:
   JISU_API_KEY=your_real_jisu_api_key_here
   LIUPAI_API_KEY=your_real_liupai_api_key_here
   JUHE_API_KEY=your_real_juhe_api_key_here

方法2 - 设置环境变量:
Linux/Mac:
  export JISU_API_KEY="your_real_api_key_here"
  export LIUPAI_API_KEY="your_real_api_key_here"
  export JUHE_API_KEY="your_real_api_key_here"

Windows:
  set JISU_API_KEY=your_real_api_key_here
  set LIUPAI_API_KEY=your_real_api_key_here
  set JUHE_API_KEY=your_real_api_key_here
"""